
package controle;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 *
 * @author root
 */
public class Bitmap {
    
    private byte[] bitmap;
    private int length;
    private long deslocamento;
    
    private RandomAccessFile arquivo;
    
    public Bitmap(RandomAccessFile arquivo, int length, long deslocamento) throws IOException {
        this.arquivo = arquivo;
        this.length = length;
        this.deslocamento = deslocamento;
        this.bitmap = new byte[length >> 3];
        
        arquivo.seek(deslocamento);
        arquivo.read(bitmap);
    }
    
    public int primeiroDisponivel () throws IOException {
        for ( int i = 0; i < bitmap.length; i++ ) {
            if ( bitmap[i] != Byte.MIN_VALUE ) {
                for ( int j = 0; j < Byte.SIZE; j++ ) {
                    if ( (bitmap[i] & ( 1 << j )) == 0 ) {
                        bitmap[i] = (byte)( bitmap[i] | ( 0x0001 << j ) );
                        arquivo.seek(deslocamento + i);
                        arquivo.writeByte(bitmap[i]);
                        return ((i << 3) + j);
                    }
                }
            }
        }
        return -1;
    }

    @Override
    public String toString() {
        String retorno = new String();
        for ( int i = 0; i < bitmap.length; i++ )
            for ( int j = 0; j < Byte.SIZE; j++ )
                retorno += ( (bitmap[i] & ( 1 << j )) == 0 ) ? "0 " : "1 ";
        return retorno;
    }
}
